welcome
本篇文章编写智能合约中的create2的使用,也就是uniswap中的UniswapV2Factory合约中的createPair方法.具体的信息可参考eip1014与the-magical-world-of-create2.
create2的使用方式
1 | bytes memory bytecode = type(UniswapV2Pair).creationCode; |
- 此处主要注意看以上两行代码,按照字面意思我们需要UniswapV2Pair的合约, token0, token1组成的salt,最后面再调用UniswapV2Pair的初始化函数,即完成了整个create2的使用,
- 对的,就是这么简单.那么这样单独抽出一个UniswapV2Factory的作用是什么呢?
因为我们是批量创建相同的合约,只是每个合约的里面记录的数据不同而已,所以这里我们还得引入另一个合约函数来配合使用,他就是
UniswapV2Library中的pairFor方法,此方法可以根据创建的参数返回正确的合约地址.其中factory参数就是上述使用create2的合约地址1
2
3
4
5
6
7
8
9
10// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff', // 固定值
factory, // 使用create2的合约地址
keccak256(abi.encodePacked(token0, token1)), // 确定唯一的合约
hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
))));
}
学以致用
此处我们使用create2实现一个功能,记录Apple手机的制作流程,具体使用AppleFactory定义手机的信息,然后把指定具体的工厂来加工生产出Apple,并将数据保存在区块链上
- 一台手机包括唯一序列号,外观颜色,运行内存大小,以及存储空间,这里加了一个加工次数来记录整个流程,其中核心方法initialize为初始化此产品的基本信息,
processAction记录加工流程, updatePlayer交接给下一个工厂完成继续制造
1 | // SPDX-License-Identifier: MIT |
- factory合约应由苹果公司根据实际的生产情况进行管理,并录入基本信息(此处由于测试,任何人都可以创建),此处的makeApple即使生产apple, getApple可以用来得到生产出来的apple的具体合约地址,
1 | // SPDX-License-Identifier: MIT |
demo演示
- 前端源码,合约源码
- 首先制造成产了一台iPhone,填入颜色,内存与储存空间
- 进入加工环节,当执行process时,自动进入到下一个加工环节
- …
- 跟随者加工流程指导加工生产完成,这样可以记录每一台手机的生产流程,且具体的流程可信
总结
- 可以按照编程语言中的面向对象思想进行理解,create2传入的参数bytecode就是class的字节码,而create2相当于new,而我们又可以根据传入create2加上其factory的地址以及salt恢复找到以这salt为key的合约地址且唯一,而且合约的地址提前可知呢.Ó´
- 那么按照介绍使用create2,我们需要两个合约,一个template合约(类),一个factory合约(负责new)即可,是不是很简单的?
- 如果使用create2创建了一个合约,再使用同样的参数进行调用,是不能成功的,除非已创建的合约调用selfdestruct(address)释放掉才行
- 接下来就可以进入到在第一篇文章中所提到的三个合约中的UniswapV2Pair,也即使最后一个合约
- 其实到这里来说,合约知识中的难点已经讲解的差不多了,剩下的其实是关于uniswap中的创新思想的复习咯
关于我
区块链程序猿一枚